import {AxiosError, AxiosInstance, InternalAxiosRequestConfig} from "axios"

/**
 * 请求发送前进行自定义预处理的处理函数的默认实现
 */
const preSendReqHandlerDefault = () => {
}

/**
 * 请求失败处理函数的默认实现
 *
 * @param error axios 错误对象
 */
const rejectedHandlerDefault = (error: AxiosError) => {
  return Promise.reject(error)
}

/**
 * 为 axios 实例对象添加请求拦截器
 *
 * @param axios axios 实例对象
 * @param preSendReqHandler 请求发送前进行自定义预处理的处理函数，参数列表：config —— axios 请求配置对象，
 * 默认值 {@link preSendReqHandlerDefault}
 * @param rejectedHandler 请求失败处理函数，参数列表：error —— axios 错误对象，默认值 {@link rejectedHandlerDefault}
 * @returns {AxiosInstance} 添加了请求拦截器的 axios 实例对象
 */
export const addReqInterceptor = (
  axios: AxiosInstance,
  preSendReqHandler: (config: InternalAxiosRequestConfig<any>) => void = preSendReqHandlerDefault,
  rejectedHandler: (error: AxiosError) => any = rejectedHandlerDefault
): AxiosInstance => {
  axios.interceptors.request.use(
    (config) => {
      // 在请求发送之前做一些自定义处理
      preSendReqHandler(config)
      return config
    },
    (error) => {
      // 请求错误时做一些处理
      return rejectedHandler(error)
    }
  )
  return axios
}
